<?php

/**
 * 
 * @desc 身份加密验证类
 * @author keluo <pycorvn@yeah.net>
 * @link http://www.scabish.cn/framework
 * @example
 *	$id = 11; //当前ID
 *	加密步骤：
 *  $encrpt_str = SCIdentify::setID($id);
 *	SCCookie::set('id', $encrpt_str);
 *	解密步骤：
 *	if(true == SCIdentity::checkValid($encrpt_str)) { //检查通行证是否合法
 *  	SCIdentify::getID($encrpt_str); // 结果为11
 *	}
 *
 */

class SCIdentity {

	/**
	 * 
	 * 私钥串
	 * @var string
	 */
	private static $_key = 'F%(#J:I82D;3e9H*j-inb@^|w}V3';
	
	/**
	 * 检查当前加密字符串是否合法
	 * @return boolean
	 */
	public static function checkValid($string) {
		$decrypt = SCIdentity::decrypt($string);
		
		$decrypt = explode('|', $decrypt);
		if(intval($decrypt[0]) <= 0) { //检查ID合法性
			return false;
		}
		if(!isset($decrypt[1])) { //是否包含第二个元素(第一个元素为ID，第二个元素为IP)
			return false;
		}
		/**
		 * 网站使用了第三方加速代理，由于获取到的用户ip一直处于变化之中，故抛弃ip检查验证程序 
		 *
		if(self::getClientIP() != $decrypt[1]) { //检查IP是否相等
			return false;
		}
		*/
		return true;		
	}
	
	/**
	 * 
	 * 加密唯一标识ID
	 * @param string 唯一标识$id
	 * @return 加密后的字符串
	 */
	public static function setID($id) {
		return SCEncryption::encrypt(base64_encode($id.'|'.self::getClientIP()), self::$_key);
	}
	
	/**
	 * 获取当前已加密过的字符串中隐含的ID
	 * @return string 唯一标识ID
	 */
	public static function getID($string) {
		$decrypt = SCIdentity::decrypt($string);
		$decrypt = explode('|', $decrypt);
		if(!isset($decrypt[0])) {
			return false; 
		}
		return $decrypt[0];
	}
	
	/**
	 * 返回以当前用户ID、IP经系统加密函数加密后的字符串
	 * @param integer $id 唯一标识ID
	 * @return string 加密后的字符串
	 */
	private static function encrypt($id) {
		return SCEncryption::encrypt(base64_encode($id.'|'.self::getClientIP()), self::$_key);
	}
	
	/**
	 * 字符串解密
	 * @param string $text 加密字符串
	 * @return 解密后的字符串
	 */
	private static function decrypt($text) {
		return base64_decode(SCEncryption::decrypt($text, self::$_key));
	}
	
	/**
	 * 
	 * 返回当前连接的客户端IP
	 * @return string IP地址
	 */
	private static function getClientIP() {
		if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')){
			$ip = getenv('HTTP_CLIENT_IP');
		}
		elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')){
			$ip = getenv('HTTP_X_FORWARDED_FOR');
		}
		elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')){
			$ip = getenv('REMOTE_ADDR');
		}
		elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')){
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		return preg_match('/[\d\.]{7,15}/', $ip, $matches) ? $matches[0] : 'unknown';
	}
}